home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-106 < prev    next >
Text File  |  1995-12-31  |  58KB  |  1,736 lines

  1. C.S.M.P. Digest             Wed, 02 Aug 95       Volume 3 : Issue 106
  2.  
  3. Today's Topics:
  4.  
  5.         Creating Alias Files Example
  6.         Creating Finder Aliases without the help of the Finder ...
  7.         CursorDevices manager broken on PPC?
  8.         Gestalt Selectors List 3.0 released
  9.         How to access TmTask structure in PPC interrupt?
  10.         Source code to limit life of app
  11.  
  12.  
  13.  
  14. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  15. (pottier@clipper.ens.fr).
  16.  
  17. The digest is a collection of article threads from the internet newsgroups
  18. comp.sys.mac.programmer.help, csmp.tools and csmp.misc. It is designed for
  19. people who read news semi-regularly and want an archive of the discussions.
  20. If you don't know what a newsgroup is, you probably don't have access to
  21. it. Ask your systems administrator(s) for details. If you don't have access
  22. to news, you may still be able to post messages to the group by using a
  23. mail server like anon.penet.fi (mail help@anon.penet.fi for more
  24. information).
  25.  
  26. Each issue of the digest contains one or more sets of articles (called
  27. threads), with each set corresponding to a 'discussion' of a particular
  28. subject.  The articles are not edited; all articles included in this digest
  29. are in their original posted form (as received by our news server at
  30. nef.ens.fr).  Article threads are not added to the digest until the last
  31. article added to the thread is at least two weeks old (this is to ensure that
  32. the thread is dead before adding it to the digest).  Article threads that
  33. consist of only one message are generally not included in the digest.
  34.  
  35. The digest is officially distributed by two means, by email and ftp.
  36.  
  37. If you want to receive the digest by mail, send email to listserv@ens.fr
  38. with no subject and one of the following commands as body:
  39.     help                                Sends you a summary of commands
  40.     subscribe csmp-digest Your Name     Adds you to the mailing list
  41.     signoff csmp-digest                 Removes you from the list
  42. Once you have subscribed, you will automatically receive each new
  43. issue as it is created.
  44.  
  45. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  46. Questions related to the ftp site should be directed to
  47. scott.silver@dartmouth.edu.
  48.  
  49. -------------------------------------------------------
  50.  
  51. >From andrewwelc@aol.com (AndrewWelc)
  52. Subject: Creating Alias Files Example
  53. Date: 12 Jul 1995 06:09:22 -0400
  54. Organization: America Online, Inc. (1-800-827-6364)
  55.  
  56. Here's an example of some code that will create an Alias file for you. 
  57. Works like a charm, no need for AppleScript or a Scriptable Finder.
  58.  
  59. // --------------------------------------------------------------------
  60. // -- Place an alias to this folder in the Apple Menu Items folder
  61.  
  62. void MakeFolderAlias(FSSpec *snapzFolderSpec)
  63. {
  64. short appleVRefNum;
  65. long appleID;
  66. OSErr err;
  67. FSSpec aliasSpec;
  68.  
  69. // -- Setup the alias's FSSpec
  70.  
  71. err = FindFolder(kOnSystemDisk, kAppleMenuFolderType,
  72.      kCreateFolder, &appleVRefNum, &appleID);
  73.  
  74. BlockMove((Ptr)snapzFolderSpec, (Ptr)&aliasSpec, sizeof(FSSpec));
  75. aliasSpec.vRefNum = appleVRefNum;
  76. aliasSpec.parID = appleID;
  77.  
  78. // -- Next create an alias record
  79.  
  80. if (err == noErr)
  81.  {
  82.  AliasHandle   aliasHandle;
  83.  
  84.  err = NewAlias(nil, snapzFolderSpec, &aliasHandle);
  85.  if (err == noErr)
  86.   {
  87.   short myResFile;
  88.   FInfo aliasFInfo,theFileFInfo;
  89.   short aliasRefNum;
  90.   
  91. // -- Save the current resource file
  92.   
  93.   myResFile = CurResFile();
  94.  
  95. // -- Get info on the file we are making an alias of
  96.  
  97.   err = FSpGetFInfo(snapzFolderSpec, &theFileFInfo);
  98.  
  99. // -- Create and open the file.
  100.  
  101.   HCreateResFile(aliasSpec.vRefNum, aliasSpec.parID, &aliasSpec.name);
  102.  
  103.   if (ResError() == noErr)
  104.    {
  105.    aliasRefNum = FSpOpenResFile(&aliasSpec, fsCurPerm);
  106.  
  107. // -- If possible, write to the file
  108.  
  109.    if (aliasRefNum != -1)
  110.     {
  111.  
  112. // -- Write the resource
  113.  
  114.     UseResFile(aliasRefNum);
  115.     AddResource((Handle)aliasHandle, rAliasType, 0, &aliasSpec.name);
  116.     WriteResource((Handle)aliasHandle);
  117.     CloseResFile(aliasRefNum);
  118.     UseResFile(myResFile);
  119.     
  120. // -- Set the finder flags
  121.  
  122.     theFileFInfo.fdFlags = 32768;
  123.     theFileFInfo.fdCreator = 'MACS';
  124.     theFileFInfo.fdType = 'fdrp';
  125.     FSpSetFInfo(&aliasSpec, &theFileFInfo);
  126.  
  127.     }
  128.    }
  129.   }
  130.  }
  131. } // -- MakeFolderAlias
  132.  
  133. Regards,
  134.  
  135. Andrew Welch
  136. Thaumaturgist
  137. Ambrosia Software, Inc.
  138.  
  139. ..........
  140.  
  141. For the latest versions of our software, technical support, and Ambrosia
  142. news, stop by and visit the Ambrosia Software, Inc. support forums:
  143.  
  144. America Online ---> Keyword: Ambrosia
  145.     CompuServe ---> GO word: Ambrosia
  146.         eWorld --> Shortcut: Ambrosia
  147.  
  148. ---------------------------
  149.  
  150. >From iain.donaldson.1610323@bnr.ca (Iain Donaldson)
  151. Subject: Creating Finder Aliases without the help of the Finder ...
  152. Date: 7 Jul 1995 13:28:01 GMT
  153. Organization: Bell-Northern Research
  154.  
  155. I am trying to create a routine that creates Finder alias files (i.e. not
  156. just alias records, alias files containing an 'alis' resource and with the
  157. appropriate attributes set).
  158.  
  159. I can create the file, add the 'alis' (id=0) to the file, and set the
  160. 'isAlias' flag in the file attributes. Also, for simple files such as
  161. applications and documents I can set the type and creator correctly. 
  162.  
  163. I'm really trying to make sure I can alias Folders, AppleShare volumes and
  164. other "containers", and there seem to be a rather large list of file types
  165. (e.g. fdrp, drop, srvr, hdsk, ....) that can be set up. The only way I can
  166. see of generating the correct one is to spend time and effort looking at
  167. all the various file attrributes and attempting to map the correct one to
  168. the correct file type.
  169.  
  170. Before I embark on this laborious exercise, is there a simple way to do
  171. this that my (partially complete) New Inside Mac set doesn't tell me ?  I
  172. have already decided to abandon another possible alternative of sending an
  173. AEvenet to the Finder to Make an Alias as I would have to then copy/move
  174. the alias where I want it to be and possibly delete it from where it was
  175. created.
  176.  
  177. I'd welcome the input of any of you inspired geniuses out there who've
  178. found an easy way around this (or even some handy C source code to prevent
  179. my laborious recreation of other's work...;-)) ....
  180.  
  181. Cheers
  182.  
  183. ..Iain
  184.  
  185. -- 
  186. Iain Donaldson               iainad@bnr.ca / iain@iainad.demon.co.uk
  187. BNR Europe Ltd.
  188.  
  189. +++++++++++++++++++++++++++
  190.  
  191. >From mclow@coyote.csusm.edu (Marshall Clow)
  192. Date: Mon, 10 Jul 1995 10:49:17 -0700
  193. Organization: Aladdin Systems
  194.  
  195. In article <iain.donaldson.1610323-0707951427280001@bmdhm73.bnr.co.uk>,
  196. iain.donaldson.1610323@bnr.ca (Iain Donaldson) wrote:
  197.  
  198. >I am trying to create a routine that creates Finder alias files (i.e. not
  199. >just alias records, alias files containing an 'alis' resource and with the
  200. >appropriate attributes set).
  201. >
  202. [descriptions of problems deleted]
  203.  
  204. >Before I embark on this laborious exercise, is there a simple way to do
  205. >this that my (partially complete) New Inside Mac set doesn't tell me ?
  206.  
  207. Apple's suggested solution to this problem is:
  208.    "Send an AppleEvent to the Finder to create the alias".
  209.  
  210. The contents of alias files created by the finder are not documented. :-(
  211.  
  212.  
  213. >I
  214. >have already decided to abandon another possible alternative of sending an
  215. >AEvenet to the Finder to Make an Alias as I would have to then copy/move
  216. >the alias where I want it to be and possibly delete it from where it was
  217. >created.
  218. >
  219.     Are you complaining becase you find this hard, or just because it's
  220. two steps? On the other hand, you are willing to reverse-engineer the file
  221. structure  to create them yourself.
  222.  
  223.     Which is the easier, more compatible solution?
  224.  
  225. -- Marshall
  226.  
  227. -- 
  228. "They that can give up essential liberty to obtain a little temporary
  229.  safety deserve neither liberty nor safety." -- Benjamin Franklin
  230.  _Historical Review of Pennsylvania_, 1759
  231.  
  232. +++++++++++++++++++++++++++
  233.  
  234. >From andrewwelc@aol.com (AndrewWelc)
  235. Date: 11 Jul 1995 01:29:01 -0400
  236. Organization: America Online, Inc. (1-800-827-6364)
  237.  
  238. > The contents of alias files created by the finder are not documented.
  239. :-(
  240.  
  241. I didn't know that, so I went ahead and created 'em myself.  Basically you
  242. just call NewAlias() to create a new alias record, create a new file with
  243. the type 'fdrp' and the creator 'MACS', set the finder flags to 32768
  244. (sets the alias bit), and add the alias record to the resource fork
  245. (resource type = rAliasType, ID = 0, resource name = aliasSpec.name).
  246.  
  247. Works like a charm.  I didn't go with the AppleEvents route because 1) I'm
  248. not too wild about the AppleEvents implementation, and 2) I couldn't
  249. depend on a scriptable Finder being available.
  250.  
  251. Also if you think about it, Apple can't really change the format of Alias
  252. files all that easily, otherwise there would be all kind of problems when
  253. a user upgrades his/her system software version and all current alias
  254. records become invalid.  At the very least, they would build in backwards
  255. compatibility.
  256.  
  257. Regards,
  258.  
  259. Andrew Welch
  260. Thaumaturgist
  261. Ambrosia Software, Inc.
  262.  
  263. ..........
  264.  
  265. For the latest versions of our software, technical support, and Ambrosia
  266. news, stop by and visit the Ambrosia Software, Inc. support forums:
  267.  
  268. America Online ---> Keyword: Ambrosia
  269.     CompuServe ---> GO word: Ambrosia
  270.         eWorld --> Shortcut: Ambrosia
  271.  
  272. +++++++++++++++++++++++++++
  273.  
  274. >From iain.donaldson.1610323@bnr.ca (Iain Donaldson)
  275. Date: 11 Jul 1995 18:35:30 GMT
  276. Organization: Bell-Northern Research
  277.  
  278. In article <mclow-1007951049170001@ciscots1-3.csusm.edu>,
  279. mclow@coyote.csusm.edu (Marshall Clow) wrote:
  280.  
  281. > Apple's suggested solution to this problem is:
  282. >    "Send an AppleEvent to the Finder to create the alias".
  283. > The contents of alias files created by the finder are not documented. :-(
  284.  
  285. I thought it was the contents of 'Alias records' that were not documented
  286. ? I don't care about these as the OS happily creates them for me. It's the
  287. file type/creator's that I need to create for container (folder/floppy)
  288. types - i.e. how to tell if it is a folder, an appleshare volume, a hard
  289. disk, a floppy, a mounted appleshare volume, an apple mailbox etc. I
  290. thought I may have missed an easy way to get this info. and just wanted to
  291. check before I spent hours poring through NIM and then even more hours bit
  292. masking and debugging ...
  293.  
  294. > >I
  295. > >have already decided to abandon another possible alternative of sending an
  296. > >AEvenet to the Finder to Make an Alias as I would have to then copy/move
  297. > >the alias where I want it to be and possibly delete it from where it was
  298. > >created.
  299. > >
  300. >     Are you complaining becase you find this hard, or just because it's
  301. > two steps? On the other hand, you are willing to reverse-engineer the file
  302. > structure  to create them yourself.
  303. >     Which is the easier, more compatible solution?
  304.  
  305. I'm not complaining because it's hard, but because it doesn't really meet
  306. my crietia - e.g. what happens if the file is on a locked volume ? I don't
  307. want the user to see a messy dialog in between asking for the alias to be
  308. created and actually getting it - especially if the dialog isn't very
  309. relevant ("Alias will be created on the Desktop"). If the Finder had an
  310. event for creating an alias with an alias/path as to where to create it,
  311. I'd be happy (retrospectively from System 7.0, of course ;-) ...)
  312.  
  313. Oh well, looks like some effort with PBGetCatInfo and lots of bit masking
  314. coming up ...
  315.  
  316. ..Iain
  317.  
  318. -- 
  319. Iain Donaldson               iainad@bnr.ca / iain@iainad.demon.co.uk
  320. BNR Europe Ltd.
  321.  
  322. +++++++++++++++++++++++++++
  323.  
  324. >From ldo@waikato.ac.nz (Lawrence D9Oliveiro)
  325. Date: Wed, 12 Jul 1995 17:33:09 +1200
  326. Organization: University of Waikato
  327.  
  328. In article <iain.donaldson.1610323-1107951935090001@bmdhm73.bnr.co.uk>,
  329. iain.donaldson.1610323@bnr.ca (Iain Donaldson) wrote:
  330.  
  331. >In article <mclow-1007951049170001@ciscots1-3.csusm.edu>,
  332. >mclow@coyote.csusm.edu (Marshall Clow) wrote:
  333. >
  334. >> Apple's suggested solution to this problem is:
  335. >>    "Send an AppleEvent to the Finder to create the alias".
  336. >
  337. >> >I
  338. >> >have already decided to abandon another possible alternative of sending an
  339. >> >AEvenet to the Finder to Make an Alias as I would have to then copy/move
  340. >> >the alias where I want it to be and possibly delete it from where it was
  341. >> >created.
  342. >> >
  343. >>     Are you complaining becase you find this hard, or just because it's
  344. >> two steps? On the other hand, you are willing to reverse-engineer the file
  345. >> structure  to create them yourself.
  346. >> 
  347. >>     Which is the easier, more compatible solution?
  348. >
  349. >I'm not complaining because it's hard, but because it doesn't really meet
  350. >my crietia - e.g. what happens if the file is on a locked volume ?
  351.  
  352. So create the alias directly where you want it. I just mounted a read-only
  353. volume, and tried the following script:
  354.  
  355.     tell application "Finder"
  356.         make new alias at startup disk to alias "Greed:Site Licence:"
  357.     end tell
  358.  
  359. Worked like a charm. Hint: you can also specify your own name for the
  360. alias when you create it.
  361.  
  362. Lawrence
  363. scriptability fanatic and Object Model cheerleader
  364.  
  365. +++++++++++++++++++++++++++
  366.  
  367. >From iain.donaldson.1610323@bnr.ca (Iain Donaldson)
  368. Date: 12 Jul 1995 12:04:50 GMT
  369. Organization: Bell-Northern Research
  370.  
  371. In article <3tt26t$ctj@newsbf02.news.aol.com>, andrewwelc@aol.com
  372. (AndrewWelc) wrote:
  373.  
  374. > > The contents of alias files created by the finder are not documented.
  375. > :-(
  376. > I didn't know that, so I went ahead and created 'em myself.  Basically you
  377. > just call NewAlias() to create a new alias record, create a new file with
  378. > the type 'fdrp' and the creator 'MACS', set the finder flags to 32768
  379. > (sets the alias bit), and add the alias record to the resource fork
  380. > (resource type = rAliasType, ID = 0, resource name = aliasSpec.name).
  381. > Works like a charm.  I didn't go with the AppleEvents route because 1) I'm
  382. > not too wild about the AppleEvents implementation, and 2) I couldn't
  383. > depend on a scriptable Finder being available.
  384.  
  385. Andrew: 
  386.  
  387. Does this mean that you don't have to bother setting the container types
  388. to anything other than 'fdrp' (e.g. 'hdsk', 'fdsk', 'srvr' etc.) ? Also,
  389. do you find that the ICONs for the new Alias file are OK, or do you need
  390. to copy across the icon from the old file and set the custom icon flag ?
  391. (my icons seem to disappear until you use the alias for the first time).
  392.  
  393. Cheers
  394.  
  395. ..Iain
  396.  
  397. -- 
  398. Iain Donaldson               iainad@bnr.ca / iain@iainad.demon.co.uk
  399. BNR Europe Ltd.
  400.  
  401. +++++++++++++++++++++++++++
  402.  
  403. >From iain.donaldson.1610323@bnr.ca (Iain Donaldson)
  404. Date: 12 Jul 1995 17:24:26 GMT
  405. Organization: Bell-Northern Research
  406.  
  407. In article <ldo-1207951733090001@130.217.96.144>, ldo@waikato.ac.nz wrote:
  408.  
  409.  
  410. > So create the alias directly where you want it. I just mounted a read-only
  411. > volume, and tried the following script:
  412. >     tell application "Finder"
  413. >         make new alias at startup disk to alias "Greed:Site Licence:"
  414. >     end tell
  415. > Worked like a charm. Hint: you can also specify your own name for the
  416. > alias when you create it.
  417.  
  418. So does this require the scriptable FInder (7.5) or work with 7.0 ? My
  419. AppleEvent Registry for the standard Finder suite doesn't indicate I can
  420. pass info for the file to be created (for system 7.0/.1).
  421.  
  422. ..Iain
  423.  
  424. -- 
  425. Iain Donaldson               iainad@bnr.ca / iain@iainad.demon.co.uk
  426. BNR Europe Ltd.
  427.  
  428. +++++++++++++++++++++++++++
  429.  
  430. >From Michael_Hecht@mac.sas.com (Michael Hecht)
  431. Date: Thu, 13 Jul 1995 13:58:53 GMT
  432. Organization: SAS Institute Inc.
  433.  
  434. > In article <ldo-1207951733090001@130.217.96.144>, ldo@waikato.ac.nz wrote:
  435. >  
  436. > > So create the alias directly where you want it. I just mounted a read-only
  437. > > volume, and tried the following script:
  438. > > 
  439. > >     tell application "Finder"
  440. > >         make new alias at startup disk to alias "Greed:Site Licence:"
  441. > >     end tell
  442. > > 
  443. > > Worked like a charm. Hint: you can also specify your own name for the
  444. > > alias when you create it.
  445. > > 
  446.  
  447. It's also kinda hard to get the Finder to listen to an AppleEvent from
  448. your Drag Manager SendData callback procedure, since you're not supposed
  449. to process-switch within that routine. That's why I create the file myself
  450. in my code.
  451.  
  452. Actually, I would prefer for Apple to just make a "MakeAliasFile" toolbox
  453. call for me, so I wouldn't have to worry about compatibility.
  454.  
  455. --Michael
  456.  
  457. =====================================================================
  458. Michael P. Hecht                            Michael_Hecht@mac.sas.com
  459. SAS Institute Inc.; Cary, NC USA                 AppleLink: SAS.HECHT
  460.  
  461. ---------------------------
  462.  
  463. >From james@clyde.as.utexas.edu (James McCartney)
  464. Subject: CursorDevices manager broken on PPC?
  465. Date: 14 Jul 1995 22:48:48 GMT
  466. Organization: Univ of Texas at Austin, Astronomy
  467.  
  468. I am trying to port some code to PowerPC that moves the mouse. 
  469. (Don't recite HIG to me  ..)
  470.  
  471. CursorDevices.h contains the following warning:
  472.  
  473. /*
  474.                            * * *  W A R N I N G  * * * 
  475.  
  476. On currently shipping PowerMacs, the CursorDevices manager is implemented
  477. in 68K code and emulated.  Unfortunately, the MixedMode glue in InterfaceLib
  478. is incorrect.  It and the 1.0 version of this file had incorrect parameter
  479. lists for most functions.
  480.         
  481. As a first step to avoid runtime errors, the functions in this file were 
  482. renamed (e.g. from"CrsrDevButtons" to "CursorDeviceButtons").  This will result
  483. in a link time error if a PowerPC application tries to call the functions.
  484. When InterfaceLib is fixed, the new names will be exported and PowerPC
  485. code will then be able to call them.
  486.         
  487. */
  488.  
  489. As it says, I'm unable to link to the new functions on the PowerPC. The
  490. 68K version links OK. Are the old name functions really unusable? Can
  491. I declare them myself, link to them and use them OK? How do I move the
  492. mouse on the PowerPC in native code?
  493.  
  494. I am using Codewarrior.
  495.  
  496.   --- james mccartney        james@astro.as.utexas.edu
  497.  
  498. +++++++++++++++++++++++++++
  499.  
  500. >From jwbaxter@olympus.net (John W. Baxter)
  501. Date: Fri, 14 Jul 1995 21:52:29 -0700
  502. Organization: Internet for the Olympic Peninsula
  503.  
  504. In article <james-1407951749490001@mice.as.utexas.edu>,
  505. james@clyde.as.utexas.edu (James McCartney) wrote:
  506.  
  507. > As it says, I'm unable to link to the new functions on the PowerPC. The
  508. > 68K version links OK. Are the old name functions really unusable? Can
  509. > I declare them myself, link to them and use them OK? How do I move the
  510. > mouse on the PowerPC in native code?
  511. > I am using Codewarrior.
  512.  
  513. You might consider a 68K CODE resource which makes the calls that move the
  514. cursor, which you in turn call through a routine descriptor.  I haven't
  515. done this, but until there's a new InterfaceLib for PPC, it seems like a
  516. useable workaround.
  517.  
  518.    --John
  519.  
  520. -- 
  521. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  522.        I don't do windows.
  523.    jwbaxter@pt.olympus.net
  524.  
  525. +++++++++++++++++++++++++++
  526.  
  527. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  528. Date: 18 Jul 1995 06:07:41 GMT
  529. Organization: Royal Institute of Technology, Stockholm, Sweden
  530.  
  531. In article <james-1407951749490001@mice.as.utexas.edu> james@clyde.as.utexas.edu (James McCartney) writes:
  532. > As it says, I'm unable to link to the new functions on the PowerPC. The
  533. > 68K version links OK. Are the old name functions really unusable?
  534.  
  535. Only half of them. :-/
  536.  
  537. > Can I declare them myself, link to them and use them OK? How do I move
  538. > the mouse on the PowerPC in native code?
  539.  
  540. You need something like this:
  541.  
  542.     #if ! CFMSYSTEMCALLS
  543.     
  544.     enum {
  545.         uppCursorDeviceMoveToProcInfo =
  546.             kD0DispatchedPascalStackBased |
  547.             DISPATCHED_STACK_ROUTINE_SELECTOR_SIZE(kTwoByteCode) |
  548.             RESULT_SIZE(SIZE_CODE(sizeof (OSErr))) |
  549.             DISPATCHED_STACK_ROUTINE_PARAMETER(1,SIZE_CODE(sizeof (CursorDevicePtr))) |
  550.             DISPATCHED_STACK_ROUTINE_PARAMETER(2,SIZE_CODE(sizeof (long))) |
  551.             DISPATCHED_STACK_ROUTINE_PARAMETER(3,SIZE_CODE(sizeof (long)))
  552.     };
  553.     
  554.     pascal OSErr CursorDeviceMoveTo(
  555.         CursorDevicePtr ourDevice,
  556.         long absX,
  557.         long absY)
  558.     {
  559.         return CallUniversalProc(
  560.             GetToolboxTrapAddress(_CursorDeviceDispatch), 
  561.             uppCursorDeviceMoveToProcInfo,                    
  562.             1,                              /* selector code */
  563.             ourDevice,absX,absY);           /* actual parameters */
  564.     }
  565.     
  566.     #endif
  567.  
  568. Repeat the above for each function, varying the selector code and the
  569. procinfo appropriately.
  570.  
  571. ("How do I call a trap that has no PowerPC glue available (yet)?" is
  572. getting to be a FAQ.  I'd better make Chris and Jon happy by writing an
  573. answer section....)
  574.  
  575.  
  576. /Bo Lindbergh
  577.  
  578. ---------------------------
  579.  
  580. >From rgaros@bio.vu.nl (Rene G.A. Ros)
  581. Subject: Gestalt Selectors List 3.0 released
  582. Date: 13 Jul 1995 09:17:41 +0200
  583. Organization: VU Biology, Amsterdam, The Netherlands
  584.  
  585.  
  586. Dear Mac-programmers,
  587.  
  588.  
  589. Today I released version 3.0 of the
  590.  
  591.  
  592.                        Gestalt Selectors List (GSL)
  593.  
  594.  
  595. It lists all sorts of information about the Gestalt Manager, but mainly
  596. about selectors and the meaning of the returned values.
  597. The Gestalt Manager is part of the Apple Macintosh System Software to
  598. enable programmers to determine the availability of certain software and
  599. hardware.
  600.  
  601. You can obtain the latest version in several ways:
  602. - by sending email to the mail archive server at:
  603.       gestalt-selectors-list-request@bio.vu.nl
  604.   with the subject:
  605.       archive get recent/gestalt-selectors.etx
  606.   or to get the compressed version:
  607.       archive get recent/gestalt-selectors.sit.hqx
  608.  
  609. - FTP to the info-mac archives at sumex-aim.stanford.edu and get the file
  610.       /info-mac/dev/info/gestalt-selectors-30.hqx
  611.   You can also use any of its mirror sites.
  612.  
  613. - World Wide Web
  614.   The GSL is available, behind the editor's home-page, at:
  615.       http://www.bio.vu.nl/home/rgaros/gestalt/
  616.   It is also available, together with other Macintosh FAQs, at:
  617.       http://www.astro.nwu.edu/lentz/mac/faqs/source/gestalt.html
  618.   Also, on the Apple WWW site in:
  619.        http://www.info.apple.com/cgi-bin/lister-pl?Apple.Support.Area/
  620.          Developer_Services/Tool_Chest/OS_Utilities
  621.  
  622. - America OnLine
  623.   You can find the GSL on AOL in the "MDV/Documents and Proposals" directory.
  624.  
  625. - AppleLink
  626.   The GSL can be found on AppleLink at this location:
  627.  
  628.   Developer Support:Developer Services:Tool Chest:OS/Toolbox:
  629.  
  630. - CompuServe members can find it at the Macintosh Developers Forum
  631.   (GO MACDEV) in the Tools/Debuggers (13) section.
  632.   Or use the Internet locations by using GO INTERNET.
  633.  
  634. - eWorld
  635.   You can find the GSL on eWorld in this location:
  636.  
  637.   Apple Developer Services:Tool Chest:OS/Toolbox:
  638.  
  639.   The shortcut to Apple Developer Services is 'devservice'.
  640.  
  641. - CD-ROM
  642.   The GSL is included, with permission, on these CD-ROMs:
  643.       Apprentice CD-ROM                    (Celestin Company)
  644.       BBS in a BOX CD-ROM                  (Arizona Macintosh Users Group)
  645.       Bookmark CD                          (Apple Computer, Inc.)
  646.       Developer CD Series, Tool Chest      (Apple Computer, Inc.)
  647.       Info-Mac CD-ROM                      (Pacific HiTech, Inc.)
  648.       The Right Stuffed CD-ROM             (Quantum Leap Technologies, Inc.)
  649.  
  650.   (NOTE: Tool Chest CD since May 1995, Bookmark starting with #23)
  651.  
  652. - Subscribers of the maillist have received their copy already.
  653.   If you want to join this list you need to send a request to:
  654.       gestalt-selectors-list-request@bio.vu.nl
  655.   with in the subject line 'subscribe'. You will then also receive
  656.   several updates before the next version is released. This list is
  657.   only for distribution, not for discussion.
  658.  
  659. Contributions (new info, remarks, etc.) for the list can be send to:
  660.       gestalt-selectors-list@bio.vu.nl
  661.  
  662. Please, be aware that it may take a couple of days before the new version
  663. is available at all these locations. It is available immediatly by using
  664. the mail archive server.
  665.  
  666. Beside a large number of new and changed selectors, these are the major
  667. changes since the previous version:
  668.  
  669. ***************************************************************************
  670. Includes information from the WWDC Technology CD-ROM, like the
  671. Preliminary Copland Headers.
  672.  
  673. Also new are the machine types for several unreleased PowerMacs. And the
  674. selectors and responses new with System 7.5.2.
  675.  
  676. Added selectors
  677.     Apple System  : danm, nreg, opfw, nvsv, unic, wind
  678.     Apple Add.    : calb
  679.     Third Parties : InMn, MFK+
  680. Added unknown
  681.     Apple Softw.  : ??? , cnfn, fndv, bclk, gacc, pclk, pwky, rmbg, wnkl
  682.     Third Parties : 5mat, ATR , CDFL, DDCD, DDJB, DPin, KBCM, MOMM, OLE2,
  683.                     SLIP, sMon, URLf, YAWN
  684. Changed selectors
  685.     Apple System  : aslm, cmtc, dply, hdwr, mach, powr, qd  , qd3d, snhw,
  686.                     tele, thds, tsmv, vers, vm  
  687. Changed unknown
  688.     Apple Softw.  : fndx, iic , serh
  689. Previously unknown
  690.     Apple System  : afps, fnd , fnd^, iic 
  691.     Apple Add.    : otan
  692.     Third Parties : Frs1, FrsH
  693. ***************************************************************************
  694.  
  695.  
  696. Best regards,
  697. Rene Ros
  698. rgaros@bio.vu.nl
  699.  
  700. -- 
  701.   Rene G.A. Ros                                               rgaros@bio.vu.nl
  702.   Amsterdam, The Netherlands                 http://www.bio.vu.nl/home/rgaros/
  703. - ------------------------------------------------------------------------------
  704.   Recommended reading: The UnDutchables                   (ISBN 0-9625006-3-1)
  705.  
  706. ---------------------------
  707.  
  708. >From madole@mills.edu (David Madole)
  709. Subject: How to access TmTask structure in PPC interrupt?
  710. Date: 7 Jul 1995 06:35:03 GMT
  711. Organization: University of California, Berkeley
  712.  
  713. NIM goes into how to access the fields in the TmTask structure in the
  714. 68k version of the Time Manager (get the address from Register A1), but
  715. how do I do so in PPC interrupt code?  I need to use the trick of
  716. passing the address of a structure that has a TmTask at the beginning
  717. and "more" after the TmTask structure.  Is it actually passed to the
  718. interrupt routine as an argument or something like that?
  719.  
  720. This is probably really a Mixed Mode Manager question.
  721.  
  722. Thanks in advance,
  723.  
  724. Dave
  725.  
  726. Dave Madole
  727. Technical Director, Center for Contemporary Music
  728. Mills College
  729. 510-430-2336
  730.  
  731. madole@mills.edu
  732.  
  733. +++++++++++++++++++++++++++
  734.  
  735. >From scouten@metrowerks.com (Eric Scouten)
  736. Date: Fri, 07 Jul 1995 01:55:23 -0500
  737. Organization: Metrowerks, Inc.
  738.  
  739. In article <3tikio$g34@agate.berkeley.edu>, madole@mills.edu wrote:
  740.  
  741. > NIM goes into how to access the fields in the TmTask structure in the
  742. > 68k version of the Time Manager (get the address from Register A1), but
  743. > how do I do so in PPC interrupt code?  I need to use the trick of
  744. > passing the address of a structure that has a TmTask at the beginning
  745. > and "more" after the TmTask structure.  Is it actually passed to the
  746. > interrupt routine as an argument or something like that?
  747.  
  748. Yup. You can write...
  749.  
  750.    pascal void MyTimerCallback(TMTaskPtr tmTaskPtr)
  751.    {
  752.       // whatever
  753.    }
  754.  
  755.  
  756. ...and it will work if you've done the UPP stuff correctly. That can be as
  757. simple as...
  758.  
  759.    static TimerUPP myTimerCallbackUPP = NewTimerProc(MyTimerCallback);
  760.  
  761. and passing the value of myTimerCallbackUPP in the TMTask record.
  762.  
  763.  
  764. BTW, in CodeWarrior you can have the 68K version fetch the parameter
  765. directly from A1 without any special shenanigans. Write:
  766.  
  767.    #if GENERATINGCFM
  768.       pascal void MyTimerCallback(TMTaskPtr tmTaskPtr)
  769.    #else
  770.       pascal void MyTimerCallback(TMTaskPtr tmTaskPtr : __A1)
  771.    #endif
  772.    {
  773.       // whatever
  774.    }
  775.  
  776. -es
  777.  
  778. __________________________________________________________________________
  779. Eric Scouten                                       Constructor Constructor
  780. scouten@metrowerks.com                                     Metrowerks, Inc.
  781.  
  782. They're my feet and I'll put them in my mouth if I want to.
  783.  
  784. +++++++++++++++++++++++++++
  785.  
  786. >From Richard Wesley <hawkfish@punchdeck.com>
  787. Date: 7 Jul 1995 15:26:21 GMT
  788. Organization: Punch Deck Consulting
  789.  
  790. madole@mills.edu (David Madole) wrote:
  791. >NIM goes into how to access the fields in the TmTask structure in the
  792. >68k version of the Time Manager (get the address from Register A1), but
  793. >how do I do so in PPC interrupt code?  I need to use the trick of
  794. >passing the address of a structure that has a TmTask at the beginning
  795. >and "more" after the TmTask structure.  Is it actually passed to the
  796. >interrupt routine as an argument or something like that?
  797. >
  798. >This is probably really a Mixed Mode Manager question.
  799.  
  800. In CW6 I do the following:
  801.  
  802. class CTimeTask {
  803. ..
  804. typedef struct {
  805. TMTask mTask;
  806. CTimeTask *mOwner;
  807. } TMTaskExt;
  808.  
  809. static void TimerProc (TMTaskExt *inTaskExt);
  810.  
  811. TMTaskExt mTaskExt;
  812. };
  813.  
  814. CTimeTask::CTimeTask (void)
  815. {
  816. mTaskExt.mTask.tmAddr = NewTimerProc (TimerProc);
  817. mTaskExt.mOwner = this;
  818. ::InsTime ((QElemPtr) &mTaskExt);
  819. }
  820.  
  821. CTimeTask::~CTimeTask (void)
  822.  
  823.         {
  824.         
  825.                 ::RmvTime ((QElemPtr) &mTaskExt);
  826.                 
  827.                 DisposeRoutineDescriptor (mTaskExt.mTask.tmAddr);
  828.                 mTaskExt.mTask.tmAddr = nil;
  829.                 
  830.         }
  831.  
  832. #if !GENERATINGCFM
  833. #pragma parameter TaskProc (__A1)
  834. #endif
  835.  
  836. void
  837. CTimeTask::TimerProc (TMTaskExt *inTaskExt)
  838.  
  839. {
  840. ..
  841. }
  842.  
  843. This should compile correctly for both sets of hardware.  Small caveat:
  844. I have not actually tested this code (I wrote it yesterday) but the same
  845. thing works correctly for Deferred Tasks, so I assume this will work the
  846. same way.
  847.  
  848. - rmgw
  849.  
  850. http://www.punchdeck.com/hawkfish/Resume.html
  851.  
  852. - --------------------------------------------------------------------------
  853. Richard Wesley  hawkfish@punchdeck.com | "'Hand it round first, and cut it
  854. Punch Deck Consulting pnchdeck@aol.com |  afterwards.'" - Lewis Carroll,
  855.      Macintosh Software Development    |    "Through the Looking Glass"
  856. - --------------------------------------------------------------------------
  857.  
  858.  
  859.  
  860. +++++++++++++++++++++++++++
  861.  
  862. >From stevec@jolt.mpx.com.au (Stephen Coy)
  863. Date: Sun, 16 Jul 1995 11:50:16 +1000
  864. Organization: Resolve Software Pty Ltd
  865.  
  866. In article <3tjjmt$69r@news.halcyon.com>, Richard Wesley
  867. <hawkfish@punchdeck.com> wrote:
  868.  
  869. > madole@mills.edu (David Madole) wrote:
  870. > >NIM goes into how to access the fields in the TmTask structure in the
  871. > >68k version of the Time Manager (get the address from Register A1), but
  872. > >how do I do so in PPC interrupt code?  I need to use the trick of
  873. > >passing the address of a structure that has a TmTask at the beginning
  874. > >and "more" after the TmTask structure.  Is it actually passed to the
  875. > >interrupt routine as an argument or something like that?
  876. > >
  877. > >This is probably really a Mixed Mode Manager question.
  878. > In CW6 I do the following:
  879.  
  880.    <one possible solution snipped>
  881.  
  882.  
  883. > This should compile correctly for both sets of hardware.  Small caveat:
  884. > I have not actually tested this code (I wrote it yesterday) but the same
  885. > thing works correctly for Deferred Tasks, so I assume this will work the
  886. > same way.
  887. > - rmgw
  888.  
  889. Another easier way to do this is to privately inherit from the TMTask
  890. structure itself. This provides a typesafe and reliable way to implement
  891. timers whose behaviour is dictated by a virtual member function.
  892.  
  893.  
  894. class MTimer: private TMTask
  895. {
  896. public:
  897.  
  898.    void Prime(Milliseconds count);
  899.       // Inserts the TMTask into the time manager queue and primes the timer
  900.  
  901.    void Unprime();
  902.       // Removes the TMTask from the time manager queue
  903.  
  904. protected:
  905.    
  906.    MTimer();
  907.       // Inserts the task in the queue
  908.  
  909.    ~MTimer();
  910.       // Removes the timer from the queue
  911.    
  912. private:
  913.  
  914.    virtual void DoTimerCompletion() = 0;
  915.       // Must be overridden to provide desired functionality
  916.  
  917.    #if GENERATINGCFM
  918.    static pascal void TimerCompletion(MTimer* );
  919.    static RoutineDescriptor   fgTimerCompletionRoutineDescriptor;
  920.    inline static TimerUPP GetTimerCompletionFn() { return
  921. &fgTimerCompletionRoutineDescriptor; }
  922.    #else
  923.    static pascal void TimerCompletion(MTimer* aTask: __A1);
  924.    inline static TimerUPP GetTimerCompletionFn() { return
  925. (Register68kProcPtr)TimerCompletion; }
  926.    const long fA5;
  927.    #endif
  928.  
  929.    Boolean fIsInstalled;
  930.  
  931. };
  932.  
  933.  
  934. #if GENERATINGCFM
  935. RoutineDescriptor MTimer::fgTimerCompletionRoutineDescriptor 
  936.    = BUILD_ROUTINE_DESCRIPTOR(uppTimerProcInfo, MTimer::TimerCompletion);
  937. #endif
  938.  
  939.  
  940. #pragma segment Main
  941. MTimer::MTimer()
  942.  : fIsInstalled(false)
  943. #if !GENERATINGCFM
  944.    ,fA5(SetCurrentA5())
  945. #endif
  946. {
  947.    tmAddr = GetTimerCompletionFn();
  948. }
  949.  
  950. #pragma segment Main
  951. void MTimer::Unprime()
  952. {
  953.    RmvTime((QElemPtr)this);
  954.    fIsInstalled = false;
  955. }
  956.  
  957.  
  958.  
  959. #pragma segment Main
  960. MTimer::~MTimer()
  961. {
  962.    if (fIsInstalled)
  963.       RmvTime((QElemPtr)this);
  964. }
  965.  
  966.  
  967. #pragma segment Main
  968. void MTimer::Prime(Milliseconds count)
  969. {
  970.    tmCount = tmWakeUp = tmReserved = 0;
  971.    InsTime((QElemPtr)this);
  972.    fIsInstalled = true;
  973.    PrimeTime((QElemPtr)this, count);
  974. }
  975.  
  976.  
  977. #pragma segment Main
  978. #if GENERATINGCFM
  979. pascal void MTimer::TimerCompletion(MTimer* theTask)
  980. {
  981.    theTask->fIsInstalled = false;
  982.    RmvTime((QElemPtr)theTask);
  983.    theTask->DoTimerCompletion();
  984. }
  985. #else
  986. pascal void MTimer::TimerCompletion(MTimer* theTask: __A1)
  987. {
  988.    long currentA5 = SetA5(theTask->fA5);
  989.    theTask->fIsInstalled = false;
  990.    RmvTime((QElemPtr)theTask);
  991.    theTask->DoTimerCompletion();
  992.    SetA5(currentA5);
  993. }
  994.  
  995.  
  996. ... and apologies for posting actual source to this group, but this
  997. example was so short that I couldn't resist :)
  998.  
  999.  
  1000.  
  1001. Regards
  1002.  
  1003. -- 
  1004. Steve Coy
  1005. Resolve Software Pty Ltd
  1006. 4 Andove St
  1007. Belrose NSW 2085
  1008. Australia
  1009.  
  1010. +++++++++++++++++++++++++++
  1011.  
  1012. >From Richard Wesley <hawkfish@punchdeck.com>
  1013. Date: 16 Jul 1995 21:19:35 GMT
  1014. Organization: Punch Deck Consulting
  1015.  
  1016. stevec@jolt.mpx.com.au (Stephen Coy) wrote:
  1017. >In article <3tjjmt$69r@news.halcyon.com>, Richard Wesley
  1018. ><hawkfish@punchdeck.com> wrote:
  1019. >> madole@mills.edu (David Madole) wrote:
  1020. >> >NIM goes into how to access the fields in the TmTask structure in the
  1021. >> >68k version of the Time Manager (get the address from Register A1), but
  1022. >> >how do I do so in PPC interrupt code?  I need to use the trick of
  1023. >> >passing the address of a structure that has a TmTask at the beginning
  1024. >> >and "more" after the TmTask structure.  Is it actually passed to the
  1025. >> >interrupt routine as an argument or something like that?
  1026. >> >
  1027. >> >This is probably really a Mixed Mode Manager question.
  1028. >> 
  1029. >> In CW6 I do the following:
  1030. >
  1031. >   <one possible solution snipped>
  1032. >
  1033. >> This should compile correctly for both sets of hardware.  Small caveat:
  1034. >> I have not actually tested this code (I wrote it yesterday) but the same
  1035. >> thing works correctly for Deferred Tasks, so I assume this will work the
  1036. >> same way.
  1037. >> 
  1038. >> - rmgw
  1039. >
  1040. >Another easier way to do this is to privately inherit from the TMTask
  1041. >structure itself. This provides a typesafe and reliable way to implement
  1042. >timers whose behaviour is dictated by a virtual member function.
  1043. >
  1044. > <another solution snipped>
  1045.  
  1046. Steve and I just had a pleasant email chat in which we admired each other's
  1047. code and discussed one or two things that are probably of general interest
  1048. to this thread:
  1049.  
  1050. 1) The inheritance trick is pretty generally useful and it might be
  1051. nice to have a set of objects that are derived from other TB structures like
  1052. FSSpec (where to put that pesky full pathname routine we all have lying around)
  1053. and ParamBlockRec (never forget about A5 again...)
  1054.  
  1055. 2) I gave Steve a copy of my atomic semaphore class to replace the Boolean
  1056. member which has a small reentrancy window in Prime:
  1057.  
  1058. #pragma once
  1059.  
  1060. class CSemaphore {
  1061.  
  1062.         public:
  1063.         
  1064.                                 CSemaphore      (Boolean        inState = false)        
  1065.                                                         {mQueue.qHead = mQueue.qTail = nil; if (!inState) Unlock ();};
  1066.                                                 
  1067.                 OSErr   Lock            (void)  {return ::Dequeue (&mElem, &mQueue);};
  1068.                 void    Unlock          (void)  {if (!mQueue.qHead) ::Enqueue (&mElem, &mQueue);};
  1069.                 
  1070.         protected:
  1071.         
  1072.                 QHdr    mQueue;
  1073.                 QElem   mElem;
  1074.         };
  1075.  
  1076. Useage:
  1077.  
  1078. #include "CSemaphore.h"
  1079.  
  1080. CSemaphore s;
  1081.  
  1082. if (s.Lock ()) {
  1083.         // Didn't get resource
  1084.  } // if
  1085. else {
  1086.  //got resource
  1087.  s.Unlock ();
  1088.  } // else
  1089.  
  1090. - rmgw
  1091.  
  1092. http://www.punchdeck.com/hawkfish/PunchDeck.html
  1093.  
  1094. - --------------------------------------------------------------------------
  1095. Richard Wesley  hawkfish@punchdeck.com | "'Hand it round first, and cut it
  1096. Punch Deck Consulting pnchdeck@aol.com |  afterwards.'" - Lewis Carroll,
  1097.      Macintosh Software Development    |    "Through the Looking Glass"
  1098. - --------------------------------------------------------------------------
  1099.  
  1100.  
  1101.  
  1102. ---------------------------
  1103.  
  1104. >From rvtaylor@netcom.com (Richard Taylor)
  1105. Subject: Source code to limit life of app
  1106. Date: Fri, 30 Jun 1995 21:10:29 GMT
  1107. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1108.  
  1109. I have had a couple of betas that "expire" at a certain point after being
  1110. installed.  Has anyone seen any source code used to accomplish this?  I
  1111. assume that the expiration function is not so dumb as to be fooled by
  1112. someone changing the system date after.  Can anyone point me in the right
  1113. direction on this? 
  1114.  
  1115. Richard Taylor
  1116.  
  1117.  
  1118.  
  1119. -- 
  1120. richard taylor:     rvtaylor@netcom.com
  1121.  
  1122.  
  1123. +++++++++++++++++++++++++++
  1124.  
  1125. >From tulip@tiac.net (Ed Anson)
  1126. Date: Fri, 30 Jun 1995 20:38:11 -0400
  1127. Organization: Tulip Software
  1128.  
  1129. In article <rvtaylorDB085H.AtD@netcom.com>, rvtaylor@netcom.com (Richard
  1130. Taylor) wrote:
  1131.  
  1132. > I have had a couple of betas that "expire" at a certain point after being
  1133. > installed.  Has anyone seen any source code used to accomplish this?  I
  1134. > assume that the expiration function is not so dumb as to be fooled by
  1135. > someone changing the system date after.  Can anyone point me in the right
  1136. > direction on this? 
  1137.  
  1138. As you pointed out, any expiration mechanism can be vulnerable to hacking.
  1139. I have hacked a few in my time.
  1140.  
  1141. I have also implemented an expiration mechanism that resists hacking to
  1142. some extent. As you might guess, its resistance to hacking relies (to some
  1143. extent) on the secrecy of the mechanism. In other words, my mechanism is a
  1144. trade secret. I suspect that anyone with a credible mechanism will want to
  1145. keep it secret.
  1146.  
  1147. Of course, for a suitable fee (under a non-disclosure agreement), I could help.
  1148.  
  1149. - --------------------
  1150. Ed Anson            MediaTree: multimedia outline editor & catalog
  1151. Tulip Software
  1152. Andover, MA 01810   For details, check out my WWW page:
  1153. U.S.A.              <http://www.tiac.net/users/tulip/home.html>
  1154.  
  1155. +++++++++++++++++++++++++++
  1156.  
  1157. >From howlett@netcom.com (J. Scott Howlett)
  1158. Date: Sat, 1 Jul 1995 00:12:59 GMT
  1159. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  1160.  
  1161. In article <...> rvtaylor@netcom.com (Richard Taylor) writes:
  1162. >I have had a couple of betas that "expire" at a certain point after being
  1163. >installed.  Has anyone seen any source code used to accomplish this?  I
  1164. >assume that the expiration function is not so dumb as to be fooled by
  1165. >someone changing the system date after.  Can anyone point me in the right
  1166. >direction on this? 
  1167. >
  1168.  
  1169. The first time you notice you are being run beyond your desired date, you
  1170. should put up a dialog notifying the user what's up. If you want to be nice,
  1171. you just display the message and let them continue working. If you want to
  1172. be less nice, you quit after the dialog is dismissed. To be a little more
  1173. robust, you might set a flag in a resource somewhere the first time you
  1174. notice that the date is wrong and look at the flag, so the user can't just
  1175. set the clock back and use the program again (unless they have another copy
  1176. which they have not yet used). To be more evil, you could kill your app
  1177. when you notice the date, either by removing all your resources or by
  1178. setting your data fork and resource fork EOF to 0.
  1179.  
  1180. Whatever you do, though, MAKE SURE YOU REMOVE IT in the final product (test
  1181. for it explicitly!) Accidentally leaving in a time bomb is very embarrassing
  1182. for a software developer, and it happens more frequently than it should.
  1183.  
  1184.  
  1185.  
  1186. -- 
  1187. Scott Howlett
  1188. Storm Software, Inc.
  1189. howlett@netcom.com
  1190.  
  1191. +++++++++++++++++++++++++++
  1192.  
  1193. >From howlett@netcom.com (J. Scott Howlett)
  1194. Date: Sat, 1 Jul 1995 02:36:50 GMT
  1195. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  1196.  
  1197. In article <...> tulip@tiac.net (Ed Anson) writes:
  1198. ...
  1199. >trade secret. I suspect that anyone with a credible mechanism will want to
  1200. >keep it secret.
  1201. ...
  1202.  
  1203. Many schemes fail because any half-witted user can still keep a
  1204. backup of the software and reinstall it with the clock set back.
  1205.  
  1206. I suppose if you wanted to guard against this, you could write a prefs file
  1207. which tells that particular version of your app never to run again. But if
  1208. you do this in a nice way (putting it in the Prefs folder in a file or
  1209. folder with your app's name), it's easy to circumvent. If you do it in a
  1210. not-so-nice way, you probably oughtn't to be doing it.
  1211.  
  1212. Time-bombing betas seems like one of those things which you should put a
  1213. little effort into, but not a lot. It's usually not like you're guarding
  1214. trade secrets or NSA spy data or anything. You're typically just preventing
  1215. piracy of "free" or buggy versions of your software, or providing your
  1216. beta testers with a gentle reminder that they are running code which is
  1217. by now crusty and moldy :-)
  1218.  
  1219.  
  1220. -- 
  1221. Scott Howlett
  1222. Storm Software, Inc.
  1223. howlett@netcom.com
  1224.  
  1225. +++++++++++++++++++++++++++
  1226.  
  1227. >From peter@mail.peter.com.au (Peter N Lewis)
  1228. Date: Thu, 06 Jul 1995 13:34:45 +0800
  1229. Organization: Curtin University
  1230.  
  1231. In article <howlettDB0n9E.8pw@netcom.com>, howlett@netcom.com (J. Scott
  1232. Howlett) wrote:
  1233.  
  1234. >beta testers with a gentle reminder that they are running code which is
  1235. >by now crusty and moldy :-)
  1236.  
  1237. What, you mean it doesn't start that way?  Damn, I knew I was doing
  1238. something wrong!
  1239.  
  1240. >Time-bombing betas seems like one of those things which you should put a
  1241. >little effort into, but not a lot. 
  1242.  
  1243. Yup, I just use a feature of pascal, "compsecs" which returns the date the
  1244. application was compiled.  I use that and the vers resource and the
  1245. current date on the Mac.  If the vers resource says it's a non-final
  1246. version, and the date is N months after the compile time, then I notify
  1247. the user and if it's N+M months, I refuse to run.
  1248.  
  1249. But I deliberately dont want the program disabling itself, and
  1250. deliberately do tell the user they can set back their clocks to make it
  1251. work, because my main program is an FTP client, and if they want to get
  1252. the new version, they need a working version first :-)
  1253.    Peter.
  1254.  
  1255. +++++++++++++++++++++++++++
  1256.  
  1257. >From nick+@pitt.edu ( nick.c )
  1258. Date: 6 Jul 1995 15:32:35 GMT
  1259. Organization: The Pitt, Chemistry
  1260.  
  1261. In article <peter-0607951334450001@rocky.curtin.edu.au>,
  1262. peter@mail.peter.com.au (Peter N Lewis) wrote:
  1263.  
  1264. >Yup, I just use a feature of pascal, "compsecs" which returns the date the
  1265. >application was compiled.  I use that and the vers resource and the
  1266. >current date on the Mac.  If the vers resource says it's a non-final
  1267. >version, and the date is N months after the compile time, then I notify
  1268. >the user and if it's N+M months, I refuse to run.
  1269.  
  1270.  
  1271.     Each time through the loop consider logging the computer time
  1272.       to the preferences file, if the computer time on a launch
  1273.       is before the last loged time, the program should get 
  1274.       suspicious.  
  1275.  
  1276.     Also, consider having the program check if the computer time
  1277.       is before the modification date on the "finder preferences"
  1278.       file - if so the program should get suspicious.  Odds are
  1279.       no ones going to think about, or want to, delete their finder
  1280.       preferences, but it get's modified so often that it's mod
  1281.       date is a pretty accurate guess as to the "real" time, 
  1282.       even if joe user set's his clock back one month.
  1283.  
  1284.     I like the idea of having the computer use the compile time
  1285.       as a zero reference.  Saves headache of having to calculate
  1286.       the exact seconds from Jan 1, 1904 to the date you want things
  1287.       to happen each time, and means you don't have to change
  1288.       that value with each release.  Neat.
  1289.  
  1290.  
  1291. >But I deliberately dont want the program disabling itself, and
  1292. >deliberately do tell the user they can set back their clocks to make it
  1293. >work, because my main program is an FTP client, and if they want to get
  1294. >the new version, they need a working version first :-)
  1295.  
  1296.  
  1297.      Maybe not disable itself, but I agree with an earlier 
  1298.        poster that the first time the program gets suspicious
  1299.        it should toggle an irreversible flag.  eg, have an
  1300.        extra DITL resource, and when the program gets suspicious
  1301.        delete it (or toggle a "delete the DITL resource 128 first
  1302.        time the program isn't locked" flag in the preferences
  1303.        file if it finds the program innacessible.)  What you
  1304.        choose to do when your program sees that flag is up to
  1305.        you, but it makes it harder for the user to lie to the
  1306.        program about the date.
  1307.  
  1308.      I would discourage people from creating more invisible 
  1309.        files in the preferences folder.  I tend to delete 
  1310.        'em on principle.
  1311.  
  1312.  
  1313.  ---------------------= Nicholas C. DeMello =--------------------
  1314.  
  1315.  Internet: nick+@pitt.edu            _/   _/  _/  _/_/_/   _/   _/  
  1316.    eWorld: nick                     _/_/ _/  _/  _/   _/  _/_/_/ 
  1317.       CIS: 71232,766               _/ _/_/  _/  _/       _/ _/    
  1318.      http://www.pitt.edu/~nick/   _/   _/  _/   _/_/_/  _/   _/     
  1319.                     
  1320.  
  1321. +++++++++++++++++++++++++++
  1322.  
  1323. >From peter@stairways.com.au (Peter N Lewis)
  1324. Date: Fri, 07 Jul 1995 10:57:01 +0800
  1325. Organization: Stairways Software
  1326.  
  1327. In article <rvtaylorDB085H.AtD@netcom.com>, rvtaylor@netcom.com (Richard
  1328. Taylor) wrote:
  1329.  
  1330. >I have had a couple of betas that "expire" at a certain point after being
  1331. >installed.  Has anyone seen any source code used to accomplish this?  I
  1332. >assume that the expiration function is not so dumb as to be fooled by
  1333. >someone changing the system date after.  Can anyone point me in the right
  1334. >direction on this? 
  1335.  
  1336. Well, this code certainly is that dumb, but thats my intention.  The
  1337. purpose of the expirey code is to convince my silly beta testers to update
  1338. to the current version.
  1339.  
  1340. I don't know if C has an equivalent of compsecs (the time that the
  1341. compilcation took place).  Note that this code uses the later of the
  1342. compilation date that is passed to it as a parameter and the compilation
  1343. date of this file.  Usuaully I call it from the main code and that file is
  1344. compiled fairly often.
  1345.  
  1346. Note also that this code uses fixed strings, not in resources - since this
  1347. is only displayed on expired beta versions, I dont see any problem with
  1348. not localizing them.
  1349.  
  1350. Naturally, it uses other modules, some of which may be abvailable at my
  1351. ftp site:
  1352.  
  1353. ftp://ftp.amug.org/pub/peterlewis/
  1354. ftp://redback.cs.uwa.edu.au/Others/PeterLewis/
  1355. ftp://ftp.share.com/pub/peterlewis/
  1356. ftp://ftp.nig.ac.jp/pub/mac/PeterLewis/
  1357. ftp://nic.switch.ch/software/mac/peterlewis/
  1358.  
  1359. Enjoy,
  1360.    Peter.
  1361.  
  1362.  
  1363. unit MyExpiry;
  1364.  
  1365. interface
  1366.  
  1367.    uses
  1368.       Types;
  1369.  
  1370.    function ExpiredVersion (cs:longInt; notify, expire: integer): boolean;
  1371. { Pass it compsecs, and the number of months until it notifies/expires }
  1372.  
  1373. implementation
  1374.  
  1375.    uses
  1376.       OSUtils, MyStrings, MyVersionResource, MyEmergencyNotifier, MyUtils;
  1377.  
  1378.    function ExpiredVersion (cs:longInt; notify, expire: integer): boolean;
  1379.       var
  1380.          date, diff: longInt;
  1381.          vers: versionRecord;
  1382.    begin
  1383.       ExpiredVersion := false;
  1384.       GetVersion(vers);
  1385.       if vers.devcode <> $80 then begin
  1386.          GetDateTime(date);
  1387.          if compsecs > cs then begin
  1388.             cs := compsecs;
  1389.          end;
  1390.          diff := (date - cs) div 2678400;
  1391.          if diff >= expire then begin
  1392.             EmergencyNotify('This developmental version has expired.  Set
  1393. your clock back, or get a new version');
  1394.             ExpiredVersion := true;
  1395.          end
  1396.          else if diff >= notify then begin
  1397.             EmergencyNotify('This developmental version has expired.  It
  1398. will work for a while, and then stop working forever.  Get a new
  1399. version');
  1400.          end;
  1401.       end;
  1402.    end;
  1403.  
  1404.  
  1405. end.
  1406. -- 
  1407. The best book I've read recently is "Quarantine" by Greg Egan
  1408.  
  1409. +++++++++++++++++++++++++++
  1410.  
  1411. >From chrisman@ucdmath.ucdavis.edu (Mark Chrisman)
  1412. Date: Sun, 09 Jul 1995 05:51:37 -0700
  1413. Organization: University of California, Davis
  1414.  
  1415. One thing you can do is delete the application itself!
  1416.  
  1417. (There's a cute program somewhere called Cheshire Cat which demonstrates this.)
  1418.  
  1419. -- 
  1420. Mark Chrisman
  1421.  
  1422. +++++++++++++++++++++++++++
  1423.  
  1424. >From nick+@pitt.edu ( nick.c )
  1425. Date: Sun, 09 Jul 1995 12:57:52 -0500
  1426. Organization: The Pitt, Chemistry
  1427.  
  1428. In article <chrisman-0907950551370001@modem171.ucdavis.edu>,
  1429. chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  1430.  
  1431. >One thing you can do is delete the application itself!
  1432. >
  1433. >(There's a cute program somewhere called Cheshire Cat which demonstrates this.)
  1434.  
  1435.  
  1436.     I remember that one, was the code for that ever made 
  1437.       available?  It was a neat effect, and I don't know
  1438.       how one would do that - since the program would have
  1439.       to quit itself before deleting itself.
  1440.  
  1441.  
  1442.  ---------------------= Nicholas C. DeMello =--------------------
  1443.  
  1444.  Internet: nick+@pitt.edu            _/   _/  _/  _/_/_/   _/   _/  
  1445.    eWorld: nick                     _/_/ _/  _/  _/   _/  _/_/_/ 
  1446.       CIS: 71232,766               _/ _/_/  _/  _/       _/ _/    
  1447.      http://www.pitt.edu/~nick/   _/   _/  _/   _/_/_/  _/   _/     
  1448.                     
  1449.  
  1450. +++++++++++++++++++++++++++
  1451.  
  1452. >From "Marjorie L. Rhyne" <mrhyne@phenix.pdial.interpath.net>
  1453. Date: 10 Jul 1995 04:50:28 GMT
  1454. Organization: Interpath -- Providing Internet access to North Carolina
  1455.  
  1456. > >One thing you can do is delete the application itself!
  1457. > >
  1458.  > >(There's a cute program somewhere called Cheshire Cat which demonstrates this.)
  1459.  >
  1460.  >
  1461.  >    I remember that one, was the code for that ever made 
  1462.  >      available?  It was a neat effect, and I don't know
  1463.  >      how one would do that - since the program would have
  1464.  >      to quit itself before deleting itself.
  1465.  >
  1466.  >
  1467.  
  1468. I haven't tried it but I don't think you would have many problems with a coding a 
  1469. program to delete itself.  You should be able to do it by either using appleevents
  1470. or by closing the resource fork of the application,this only applies to 68k 
  1471. programs, after first creating a block of mem with the code to delete the program 
  1472. in it. Just write a self-sufficient procedure witch does the deleting - including 
  1473. the closeres call, call newptr with the size of the procedure, then do a block move 
  1474. to move it, then just jump to your detached procedure.
  1475.  
  1476.  
  1477.  
  1478. +++++++++++++++++++++++++++
  1479.  
  1480. >From hnsngr@sirius.com (Ron Hunsinger)
  1481. Date: Mon, 10 Jul 1995 02:02:32 -0700
  1482. Organization: ErsteSoft
  1483.  
  1484. In article <nick+-0907951257520001@ehdup-a-3.rmt.net.pitt.edu>,
  1485. nick+@pitt.edu ( nick.c ) wrote:
  1486.  
  1487. > In article <chrisman-0907950551370001@modem171.ucdavis.edu>,
  1488. > chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  1489. > >One thing you can do is delete the application itself!
  1490. > >
  1491. > >(There's a cute program somewhere called Cheshire Cat which
  1492. demonstrates this.)
  1493. >     I remember that one, was the code for that ever made 
  1494. >       available?  It was a neat effect, and I don't know
  1495. >       how one would do that - since the program would have
  1496. >       to quit itself before deleting itself.
  1497.  
  1498. It's easy to write. You don't even have to do anything fancy. After you
  1499. prepare the necessary parameters, deleting the file takes only three
  1500. calls:
  1501.  
  1502.    CloseResFile
  1503.    FSDelete (or PBDelete)
  1504.    ExitToShell
  1505.  
  1506. Just be sure all three are in memory. Neither of the first two calls is
  1507. going to move the code, and you don't care if the third one does.
  1508.  
  1509. -Ron Hunsinger
  1510.  
  1511. +++++++++++++++++++++++++++
  1512.  
  1513. >From troika@panix.com (Mark Coniglio)
  1514. Date: Mon, 10 Jul 1995 08:51:58 -0500
  1515. Organization: Troika Ranch
  1516.  
  1517. In article <3tqbik$s9j@redstone.interpath.net>, "Marjorie L. Rhyne"
  1518. <mrhyne@phenix.pdial.interpath.net> wrote:
  1519.  
  1520. > > >One thing you can do is delete the application itself!
  1521. > > >
  1522.  
  1523. It might be simpler to have the program delete a specific resource
  1524. from itself - one that it looks for each time it boots. If you wanted
  1525. to be really mean, you could delete one of the CODE resources which
  1526. would cause the program to crash as soon as it attempted to load that
  1527. resource.
  1528.  
  1529. The first suggestion would probably be enought to stop the average user.
  1530.  
  1531. -- MC
  1532.  
  1533. -- 
  1534. Mark Coniglio -- Troika Ranch / Dance Theater
  1535.  
  1536. mail: troika@panix.com
  1537. http: www.art.net/Studios/Performance/Dance/Troika_Ranch/TroikaHome.html
  1538.  
  1539. +++++++++++++++++++++++++++
  1540.  
  1541. >From ray@icon.net (Ray Hatfield)
  1542. Date: 10 Jul 1995 23:11:02 GMT
  1543. Organization: (ICON) InterConnect Online, Inc.
  1544.  
  1545. In article <nick+-0907951257520001@ehdup-a-3.rmt.net.pitt.edu>,
  1546. nick+@pitt.edu ( nick.c ) wrote:
  1547.  
  1548. > In article <chrisman-0907950551370001@modem171.ucdavis.edu>,
  1549. > chrisman@ucdmath.ucdavis.edu (Mark Chrisman) wrote:
  1550. > >One thing you can do is delete the application itself!
  1551. > >
  1552. > >(There's a cute program somewhere called Cheshire Cat which
  1553. demonstrates this.)
  1554. >     I remember that one, was the code for that ever made 
  1555. >       available?  It was a neat effect, and I don't know
  1556. >       how one would do that - since the program would have
  1557. >       to quit itself before deleting itself.
  1558.  
  1559.  
  1560. I missed part of this thread, so I have no idea what you're talking about, but;
  1561.  
  1562. It seems that you *might* be able to call DetachResource() to separate
  1563. your running app from the file on disk (like an INIT?) and then delete
  1564. yourself? You'd have to close the application file, but you wouldn't
  1565. necessarily have to *quit* the program. I've never done it - just a
  1566. thought.
  1567.  
  1568. The more I think about that, the more interesting this seems. If anyone
  1569. knows more I'd love to hear some thoughts on it.
  1570.  
  1571. -Ray
  1572.  
  1573. +++++++++++++++++++++++++++
  1574.  
  1575. >From stay@park.uvsc.edu (Steve Taylor)
  1576. Date: 14 Jul 1995 13:04:55 -0600
  1577. Organization: Utah Valley State College, Orem, Utah
  1578.  
  1579. Peter N Lewis (peter@stairways.com.au) wrote:
  1580. : In article <rvtaylorDB085H.AtD@netcom.com>, rvtaylor@netcom.com (Richard
  1581. : Taylor) wrote:
  1582.  
  1583. : >I have had a couple of betas that "expire" at a certain point after being
  1584. : >installed.  Has anyone seen any source code used to accomplish this?  I
  1585. : >assume that the expiration function is not so dumb as to be fooled by
  1586. : >someone changing the system date after.  Can anyone point me in the right
  1587. : >direction on this? 
  1588.  
  1589. : Well, this code certainly is that dumb, but thats my intention.  The
  1590. : purpose of the expirey code is to convince my silly beta testers to update
  1591. : to the current version.
  1592.  
  1593. [Peter's Code deleted]
  1594.  
  1595. Peter's code is more flexible than mine (with seperate checks for
  1596. old and completely expired).  For variety, here's my solution (in C).
  1597. This is intended to be put in a header file and included various
  1598. places.  This is so the code actually gets duplicated everywhere the
  1599. macro is used, which makes it harder to disable, if you care about
  1600. that sort of thing.
  1601.  
  1602. Also, using a compiler-defined symbol for the date would be much
  1603. preferrable than the replace-the-constants system I'm using.
  1604.  
  1605. //
  1606. //      Header file for the Beta Alert.
  1607. //      This file has macros for including in your source to show an alert and quit
  1608. //      when the application is older than a certain number of days.
  1609. //      This should only be used for beta versions that are expected to be updated
  1610. //      frequently, as this behaviour will really irritate legitimate users.
  1611. //
  1612. //      There is no corresponding source file to this file, just use the macros here.
  1613. //      The reason I'm using macros here is so you can include the code several places
  1614. //      and slightly discourage hackers.
  1615. //
  1616. //      Copyright) 1995         Steven H. Taylor.       All Rights Reserved.
  1617. //
  1618.  
  1619.  
  1620.  
  1621. #define BETA            1               //      if true, check for date limitation
  1622.  
  1623.  
  1624. #ifdef BETA
  1625.  
  1626. #include <OSUtils.h>
  1627.  
  1628. #define         kOldDays        180L            //      around 6 months
  1629. #define         kSecsPerDay     3600L
  1630.  
  1631. #define         kBetaAlertID    405             //      message alert complaining about an old beta
  1632.  
  1633. #define REL_YEAR        1995    //      release year, etc.
  1634. #define REL_MONTH       7
  1635. #define REL_DAY         8
  1636. //      plug in release dates here
  1637.  
  1638. #define DOBETAALERT\
  1639.         {\
  1640.                 DateTimeRec             xxxTheDate;\
  1641.                 unsigned long   xxxTheDateSecs;\
  1642.                 unsigned long   xxxTheSecs;\
  1643.                 unsigned long   xxx1, xxx2;\
  1644.                 \
  1645.                 xxxTheDate.year = REL_YEAR;\
  1646.                 xxxTheDate.month = REL_MONTH;\
  1647.                 xxxTheDate.day = REL_DAY;\
  1648.                 xxxTheDate.hour = 0;\
  1649.                 xxxTheDate.minute = 0;\
  1650.                 xxxTheDate.second = 0;\
  1651.                 xxxTheDate.dayOfWeek = 0;\
  1652.                 \
  1653.                 DateToSeconds(&xxxTheDate, &xxxTheDateSecs);\
  1654.                 GetDateTime(&xxxTheSecs);\
  1655.                 xxx1 = kOldDays;\
  1656.                 xxx2 = kSecsPerDay;\
  1657.                 \
  1658.                 if (xxxTheSecs > xxxTheDateSecs + (xxx1 * xxx2)) {\
  1659.                         StopAlert(kBetaAlertID, NULL);\
  1660.                         ExitToShell();\
  1661.                 }\
  1662.         }\
  1663.         
  1664. #else           //      BETA is not defined
  1665.  
  1666. #define DOBETAALERT             //      nothing
  1667.  
  1668. #endif
  1669.  
  1670. -- 
  1671. -- Steve Taylor (stay@wahoo.com  or  stay@park.uvsc.edu)
  1672. --
  1673. --  "Ha Ha," said Eeyore bitterly.  "Merriment and what-not.
  1674. --  Don't apologize.  It's just what *would* happen."
  1675.  
  1676. +++++++++++++++++++++++++++
  1677.  
  1678. >From bc@wetware.com (monsieur HAINEUX)
  1679. Date: 17 Jul 1995 18:29:18 GMT
  1680. Organization: Castle Wetware
  1681.  
  1682. In a simple proof that this margin is too narrow to contain, 
  1683.  
  1684. I have shown that 
  1685.       "Source code to limit the life of the app" 
  1686. is to 
  1687.       comp.sys.FOO.programmer.BAR 
  1688. as 
  1689.       "Does the refrigerator light REALLY go out when you close the door?" 
  1690. is to 
  1691.       *.[physics|puzzles]{.*}
  1692.  
  1693. mr HEINOUS
  1694.  
  1695. the solution, for those that care:
  1696. 1) The fridge light is friends with the Heisenberg Uncertainty Principle,
  1697. and therefore you cannot decide if the light is REALLY off or not, because
  1698. the lightbulb is actually smart enough to see what you're up to, trick you
  1699. into thinking you know what the answer is, and then promptly change its
  1700. behavior.
  1701.  
  1702. 2) There is NO way to create ANY program that runs only until some
  1703. specified time, because, since I can see your code, I can make a patch
  1704. that will trick your code into thinking it is working correctly.
  1705.  
  1706. Now, if people would offer programs or source to problem 2, we could
  1707. actually PLAY this game, but as I said, it's Heisenberg-complete, so
  1708. there, nyah.
  1709.  
  1710. ---------------------------
  1711.  
  1712. End of C.S.M.P. Digest
  1713. **********************
  1714.